home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
071-080
/
amok71
/
openclose
/
openclose.def
next >
Wrap
Text File
|
1993-11-04
|
10KB
|
267 lines
(**************************************************************************
:Program. DEFINITION MODULE OpenClose
:Contents. intelligente Open-Funktionen und Close-Prozeduren
:Usage. einfach importieren und benutzen...
:Copyright. Public Domain.
:Author. Thomas Ansorge
:Address. Dinkelackerring 55, W-6730 Neustadt, Deutschland
:Language. Modula-2
:Translator. M2Amiga V4.0 (deutsch)
:Version. 1.4 vom 17.05.1992
:History. 0.9 vom 06.12.1991: erste Tipparbeiten...
:History. 1.0 vom 08.12.1991: Es läuft.
:History. 1.1 vom 21.12.1991:
:History. - verbesserte Fehlerbehandlung
:History. - OpenWindow prüft die Existenz eines Screens bei
:History. customScreen nach.
:History. 1.2 vom 01.01.1992:
:History. - Verbesserung in CreatePort
:History. - Verbesserung in CloseWindow
:History. 1.3 vom 07.04.1992:
:History. - neue Variablen: AFPuffer, DebugMode
:History. 1.4 vom 17.05.1992:
:History. - neue Funktion OpenScreenTagList
:History. - neue Variable kick20
**************************************************************************)
DEFINITION MODULE OpenClose;
(*$ NameChk := FALSE LargeVars := FALSE LongAlign := FALSE *)
IMPORT DD: DosD;
IMPORT ED: ExecD;
IMPORT GD: GraphicsD;
IMPORT ID: IntuitionD;
FROM SYSTEM IMPORT ADDRESS;
IMPORT UD: UtilityD;
(* --------------------------------------------------------------------- *)
(* V A R I A B L E N *)
(* ~~~~~~~~~~~~~~~~~ *)
(* ErrorHandling bestimmt, was im Fehlerfall (Öffnen) passieren soll: *)
(* ErrorAssert (default) bricht mit einem Assert ab, ErrorBreakPoint *)
(* setzt einen BreakPoint und ErrorNothing läßt OpenClose nichts tun. *)
TYPE ErrorHandlingType = (ErrorAssert, ErrorBreakPoint, ErrorNothing);
VAR ErrorHandling: ErrorHandlingType;
(* OpenFont benutzt grundsätzlich die AvailFonts-Funktion aus der *)
(* DiskFonts-Library. Hier können Sie die Puffergröße festlegen. War *)
(* AFPuffer zu wenig, so enthält AFPuffer nach dem ersten Aufruf von *)
(* OpenFont die tatsächlich benötigte Größe -- Sie sollten es also dann *)
(* nicht mehr ändern! *)
CONST DefAFPuffer = 1024; (* Bytes *)
VAR AFPuffer: LONGINT;
(* RememberAFPuffer = TRUE veranlaßt OpenFont, sich die beiden Puffer *)
(* von AvailFonts (RAM und DISK) zu merken. Dies ist besonders bei *)
(* großen FONTS:-Directories nützlich, wenn mehrere Fonts zu öffnen *)
(* sind. *)
CONST DefRememberAFPuffer = FALSE;
VAR RememberAFPuffer: BOOLEAN;
(* DebugMode ist dazu da, Sie im Falle eines Patzers Ihres Programms per *)
(* Requester darüber zu informieren. *)
CONST DefDebugMode = FALSE;
VAR DebugMode: BOOLEAN;
(* mit Kick20 können Sie auf Kickstart 2.0 prüfen *)
VAR Kick20: BOOLEAN;
(* --------------------------------------------------------------------- *)
(* P R O Z E D U R E N U N D F U N K T I O N E N *)
(* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
(* grundsätzlich gilt: *)
(* Mit "Liste" oder "Listeneintrag" ist im Folgenden die private Liste *)
(* des Moduls OpenClose gemeint und nicht etwa eine Systemliste. *)
(* Alle Close-Prozeduren schließen nur diejenigen Resourcen, die durch *)
(* Funktionen aus diesem Modul geöffnet wurden. *)
(* Auch bei mehrmaligem Aufruf einer Close-Prozedur wird dieselbe *)
(* Resource nur einmal geschlossen, da alle Close-Prozeduren die *)
(* Existenz der Resource anhand der Liste nachprüfen. Einige der *)
(* Prozeduren prüfen zusätzlich die Existenz anhand von Systemlisten *)
(* nach und löschen ggf. nur den Listeneintrag. *)
(* Alle während eines Programmlaufes geöffneten und nicht geschlossenen *)
(* Resourcen werden am Programmende automatisch freigegeben. Das Frei- *)
(* geben geschieht dann in umgekehrter Reihenfolge wie das Öffnen. *)
(* Ich habe die Erfahrung gemacht, daß der AMIGA (Kickstart 1.3) *)
(* abstürzen kann, wenn gleichzeitig mehrere Fenster oder Screens *)
(* geöffnet oder geschlossen werden sollen. Dies passiert hier nicht, da *)
(* die entsprechenden Aufrufe in den Libraries in Forbid und Permit ein- *)
(* geschlosen sind. *)
(* --------------------------------------------------------------------- *)
(* für DosL.Close: *)
PROCEDURE Close (VAR File: DD.FileHandlePtr);
(* schließt die Datei und setzt File auf NIL. *)
(* --------------------------------------------------------------------- *)
(* für GraphicsL.CloseFont: *)
PROCEDURE CloseFont (VAR Font: GD.TextFontPtr);
(* Schließt den Font und setzt Font auf NIL. *)
(* --------------------------------------------------------------------- *)
(* für IntuitionL.CloseScreen: *)
PROCEDURE CloseScreen (VAR Screen: ID.ScreenPtr);
(* schließt einen mit OpenScreen geöffneten Screen dann und nur dann, *)
(* wenn kein Fenster mehr darauf geöffnet ist. Mitten im Programm wird *)
(* die Ausführung des Befehls ggf. verweigert; am Programmende werden *)
(* alle Fenster des selben Programms automatisch geschlossen, sind dann *)
(* noch Fenster übrig, wird der Benutzer per Requester so lange zum *)
(* Schließen derselben aufgefordert, bis der Screen geschlossen werden *)
(* kann. *)
(* Screen wird beim Schließen auf NIL gesetzt. *)
(* --------------------------------------------------------------------- *)
(* für IntuitionL.CloseWindow: *)
PROCEDURE CloseWindow (VAR Window: ID.WindowPtr);
(* Schließt ein mit OpenWindow geöffnetes Fenster, setzt Window auf NIL. *)
(* --------------------------------------------------------------------- *)
(* für ExecSupport.CreatePort: *)
PROCEDURE CreatePort (portName: ADDRESS;
priority: SHORTINT): ED.MsgPortPtr;
(* CreatePort prüft nach, ob ein Port dieses Namens schon existiert und *)
(* öffnet den 2. Port ggf. nicht! *)
(* --------------------------------------------------------------------- *)
PROCEDURE DeallocateAFDiskPuffer;
(* OpenFont kann die beiden Puffer von AvailFonts behalten und muß sie *)
(* dann nicht jedesmal neu erzeugen und füllen. Mit dieser Prozedur *)
(* können Sie den Puffer für die Diskfonts löschen und OpenFont zwingen, *)
(* das FONTS:-Directory beim nächsten Mal neu zu laden. *)
(* Wenn RemenberAFPuffer = FALSE ist, brauchen Sie diese Prozedur nicht. *)
(* --------------------------------------------------------------------- *)
PROCEDURE DeallocateAFMemPuffer;
(* dto. für die Fonts, die sich schon im RAM oder ROM befinden. *)
(* Diese Prozedur wird automatisch aufgerufen, wenn Sie einen Font von *)
(* Disk laden, da dann ein Font mehr im RAM ist! *)
(* --------------------------------------------------------------------- *)
(* für ExecSupport.DeletePort: *)
PROCEDURE DeletePort (VAR Port: ED.MsgPortPtr);
(* löscht den Port und setzt Port auf NIL *)
(* --------------------------------------------------------------------- *)
PROCEDURE LoescheListenEintrag (Eintrag: ADDRESS);
(* OpenClose merkt sich die geöffneten und nicht geschlossenen Resourcen *)
(* intern in einer Liste. Sollte es vorkommen, daß ein Listeneintrag *)
(* gelöscht werden MUSS, ohne daß gleichzeitig die Resource geschlossen *)
(* werden darf, DANN UND NUR DANN verwenden Sie bitte diese Prozedur. *)
(* Eintrag ist der Pointer, den die zum Listeneintrag gehörende Open- *)
(* Funktion geliefert hat, z. Bsp. ein ScreenPtr. *)
(* --------------------------------------------------------------------- *)
(* für DosL.Open: *)
PROCEDURE Open (name : ADDRESS;
accessMode: LONGINT): DD.FileHandlePtr;
(* --------------------------------------------------------------------- *)
(* für OFont.OpenFont: *)
PROCEDURE OpenFont (textAttr: GD.TextAttrPtr): GD.TextFontPtr;
(* --------------------------------------------------------------------- *)
(* für IntuitionL.OpenScreen: *)
PROCEDURE OpenScreen (VAR newScreen: ID.NewScreen): ID.ScreenPtr;
(* --------------------------------------------------------------------- *)
(* für IntuitionL.OpenScreenTagList: *)
PROCEDURE OpenScreenTagList (newScreen: ID.NewScreenPtr;
tagList : UD.TagItemPtr
): ID.ScreenPtr;
(* versucht das Öffnen nur, wenn Kick20 = TRUE ist! *)
(* --------------------------------------------------------------------- *)
(* für IntuitionL.OpenWindow: *)
PROCEDURE OpenWindow (VAR newWindow: ID.NewWindow): ID.WindowPtr;
(* Soll das Fenster auf einem Customscreen geöffnet werden, so prüft *)
(* OpenWindow zuerst nach, ob dieser überhaupt existiert; ggf. wird das *)
(* Fenster nicht geöffnet. *)
(* --------------------------------------------------------------------- *)
END OpenClose (* DEFINITION MODULE *).